home *** CD-ROM | disk | FTP | other *** search
- ; CPSMIT.ASM
- ; KERMIT - (Celtic for "FREE")
- ;
- ; This is the CP/M-80 implementation of the Columbia University
- ; KERMIT file transfer protocol.
- ;
- ; Version 4.0
- ;
- ; Copyright June 1981,1982,1983,1984,1985
- ; Columbia University
- ;
- ; Originally written by Bill Catchings of the Columbia University Center for
- ; Computing Activities, 612 W. 115th St., New York, NY 10025.
- ;
- ; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
- ; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
- ; others.
- ;
- ; This file contains the system-independent initialization, the main
- ; loop, and the commands that don't have any place better to go.
- ; All the SET xxx and status routines now in CPSCOM.ASM as CPSMIT.ASM
- ; was getting too big.
- ;
- ; revision history:
- ;
- ;edit 30, 29-Mar-1991 by MF. When looking up a TAKE-file in a TAKE command
- ; and the file is not found, complain if it's not the first TAKE of
- ; the current program execution (the automatic TAKE of KERMIT.INI)
- ;edit 29, 25-Mar-1991 by MF. Add STAY command as a synonym for SET NO-EXIT
- ; command per Martin J. Carter of Nottingham University in the U.K.
- ;edit 28, 21-Mar-1991 by MF. Modify code after "inp2a" in INPUT command
- ; so a ^C will halt TAKE-file processing
- ;edit 27, 27-Feb-1991 by MF. Add QUIT as a synonym for EXIT per code of
- ; Dr. Martin J. Carter of Nottingham University, U.K. Recognizing QUIT
- ; helps those who forget they're not in MS-Kermit, C-Kermit,
- ; Kermit-32 etc. Also add commands so that CONNECT, RECEIVE and SEND may
- ; be abbreviated to C, R and S, respectively.
- ;edit 26, 5-Nov-1990 by MF. Cosmetic changes to main HELP messages for
- ; COPY and RENAME commands.
- ;edit 25, 1-Nov-1990 by MF. Made the following command-name changes in the
- ; interest of uniformity of nomenclature (per suggestions of FDC):
- ; FCOPY to COPY, FRENAME to RENAME and STRING to OUTPUT.
- ; This means we'll have to type "CO" for CONNECT and "REC" for
- ; RECEIVE but with REMOTE now with us we have to do the latter anyway.
- ;edit 24, 18-Sep-1990 by MF. Implemented FRENAME command to rename a
- ; CP/M file.
- ;edit 23, 9-Sep-1990 by MF. Implemented commands to be sent to a
- ; remote Kermit Server (Remote commands).
- ; Implemented setting of packet sizes for RECEIVE and SEND.
- ; Put DIRECTORY/STRING help texts in proper alphabetical position.
- ; edit 22, July 6th, 1987 by OBSchou. Added a dummy Commandline to be
- ; loaded for debugging purposes as DDT destroys any command line at 80H
- ; Also fixed a bug or two...
- ;
- ; edit 21, April 8th, 1987.
- ; Various bits, including more SET SENDRECEIVE options, and make
- ; PADDING and PADCHAR valid options. Have I wasted my time, or
- ; there still systems that use padding?? Fixed a bug in the INPUT
- ; command so we know how many characters there are to check for. Also
- ; hived off the SET commands to make a new file, CPSCOM.ASM thereby
- ; reducing the size of CPSMIT.ASM. Also rename COPY command to FCOPY
- ; hence retaining a single C to imply connect.
- ;
- ; edit 20, March 30, 1987 by OBSchou.
- ; added code for no exit to CPM if a command tail is done (optional)
- ; by the SET NO-EXIT command. Added bits for SET AUTORECEIVE to enable
- ; or inhibit automatic receive of several files (if something is coming
- ; along from the remote side, do a receive. Toss first packet away.)
- ; This is first step to SERVER???
- ; Also added back the INPUT command.
- ;
- ; edit 19, March 16, 1987. Moved the code to check for and execute
- ; command tails (See Richard Russells submission below).
- ; Added flags to exit to CP/M after executing a command tail.
- ; The KERMIT.INI file is taken before the command tail is issued.
- ;
- ; edit 18, March 11, 1987 by OBSchou.
- ; Added in code for TYPE <file> and PRINT <file>. Hope to add COPY
- ; later on. Also added in code submitted by Richard Russel, to accept
- ; a command tail on entry to kermit (eg KERMIT CONNECT). This facility
- ; if used, will replace the automatic TAKE function on loading Kermit.
- ; Unfortunately, you will not be dropped back to CP/M after the command
- ; In the future, it may be possible to either accept several commands
- ; on the command tail, and possibly accept the automatic TAKE facility
- ; as well. Low on my list of things to do.
- ;
- ; edit 17, January 28, 1987 by OBSchou for DJ Roberts of Leicester
- ; Also added a couple of fixes [obs]
- ;
- ; DJR January 1987 David J. Roberts.
- ; USER made a SET option
- ; STATUS output placed in alphabetical order
- ; Report DEBUG mode and default disk
- ; Name of LOG file on SHOW/STATUS display
- ;
- ;
- ; edit 16 December 1st, OBSchou. Fixed bug in that if the overlay is not in
- ; place or correct then prtstr is not called to print the error message
- ; (As prtstr has been moved out of the system independent code)
- ;
- ; edit 15 November 10, 1986 by OBSchou. Re-inserted Pause and Break
- ; commands for release.
- ;
- ; edit 14 August 29, 1986. Removed PAUSE,BREAK,INPUT and SET CASE as
- ; these have not been fully coded or debugged. (For next
- ; version of Kermit-80...). Also tidied up a bit.
- ;
- ; 13 by OBSchou for Godfrey Nix. He writes:
- ; edit August 11,1986 Godfrey Nix, Nottingham University [gnn]
- ; To insert code for setting the packet start character on
- ; both send and receive packets (default is still 01H)
- ; and make GET and RECEIVE to be separate;
- ; use with edits to CP4PKT, CP4UTL
- ;
- ; edit 12: 19 June, 1986 by OBSchou. Added PAUSE and BREAK facility.
- ; Breaks simulate a call to sysint which tests for a B being passed.
- ; Note this is only useful if the system dependent code supports breaks,
- ; and an appropriate message is returned if breaks are not possible.
- ; Also added is the command entry for INPUT, which waits for a string
- ; from the host for a given time. The time is a very variable counter
- ; incremented every BDOS call. Trial and error will give a reasonable
- ; value. STRING acceps a string from the use and then sends it on
- ; to the host. These new commands allow a user to (almost) set up auto
- ; log on files, where BREAKS/INPUT/STRING/STRING partially emulate a user
- ; (AI LURES OK and all that). Still could do with a test, eg if not a
- ; correctly returned string go back n steps. This would make a fairly
- ; simple TAKE command a lot more complicated.
- ;
- ;edit 11: 30 May, 1986 OBSchou. Added in a couple of more routines and such
- ;
- ;edit 10: 27 May, 1986 OBSchou. Added in support for USER function
- ; removed XMIT test and routine, but also added SET FLOW-CONTROL
- ; (set for XON/XOFF flow control in both directions) and a
- ; SET CASE-SENSITIVE ON/OFF (if on => a # A, if ON => a=A)
- ;
- ;edit 9: 13 May, 1986 OBSchou, Loughborough University, UK
- ; Added in code for SET XMIT character to allow setting of the
- ; character to wait for from the host during TRANSMIT. It is
- ; a line feed by default. Also added a TAKE command, to take: commands
- ; from a named disk file. If a file is TAKEn, then all BDOS calls
- ; are trapped and tested for console input. If so, we substitute a
- ; character (or buffer) from the TAKE file specified.
- ; This may also be used in the future for a CPKERMIT.INI
- ; to be evaluated during Kermit initialsation.
- ;
- ; edit 8: February 6, 1895
- ; Add a PORT status/show routine for those machines that have more
- ; than one they can talk to. It also required a port storage variable
- ; a la SPEED and the necessary code to handle it in the SET routine.
- ; [Hal Hostetler]
- ;
- ; edit 7: 13-Jan-85 by Vanya J.Cooper Pima Commun. College Tel: 602-884-6809
- ;
- ;pcc003-pcc005 2-Jan-85 vjc modules:cp4mit,cp4tt,cp4utl
- ; These edits must all be installed together and change the way
- ; logging is handled. The log file spec is moved to a separate
- ; fcb, and not opened until an actual CONNECT command is given.
- ; This takes care of a NASTY bug that if you used any other file
- ; command between the LOG and CONNECT, the log file would get
- ; written over the last file used. This also allows logging to
- ; be "permanently" enabled until an CLOSE (new command) for all
- ; CONNECT sessions, like most other kermits do. If a log file
- ; already exists, it will be appended to. Also add two new
- ; CONNECT mode commands <esc>Q to suspend logging and <esc>R to
- ; resume. <esc>R means something else during TRANSMIT, but
- ; logging is never on then, so there shouldn't be any conflict.
- ; I also changed the write code, so that it can handle one more
- ; character after the XOFF is send to stop the host. This allows
- ; a little "slop" for systems that don't stop immediately (such
- ; as TOPS10), but it didn't help much.
- ;
- ;pcc012 4-Jan-85 vjc modules:cp4mit,cp4tt,cp4utl
- ; Use the big buffer for the log file. Move the log file back
- ; into the common fcb and only save the drive, name, and
- ; extension between connects. Add new routines to cp4utl to
- ; create or append to an existing file, and to conditionally
- ; advance buffers only if in memory. Remove edit pcc003 that
- ; allows one more character after the xoff, since it didn't
- ; really work very well and does not fit in well with the way
- ; the buffer advancing routines are set up. If someone still
- ; thinks this would be useful, it could be put back in with a
- ; little more work.
- ;
- ; While testing this edit, I also noticed another bug that
- ; the command parsing routines do not limit or check the
- ; length of command lines or file specs, trashing what ever
- ; comes after them. Currently because of where the fcb and
- ; command buffer are located, this does not usually cause a
- ; problem, but could if an extremely long line was typed in,
- ; or in the future multiple fcbs defined elsewhere in memory
- ; were used. Maybe this should be put on the bug list
- ; somewhere.
- ;
- ;pcc013 8-Jan-85 vjc modules:cp4mit,cp4utl,cp4typ
- ; Replace CLOSE command to cancel session logging to SET
- ; LOGGING ON/OFF. This seems to fit in with the command
- ; structure better. Default the log file to KERMIT.LOG
- ; incase no previous LOG command. Logging is also enabled
- ; by LOG command, as before.
- ;
- ; edit 6: September 8, 1984
- ; Add VERSION command, to display the internal version strings.
- ; Move command tables here from CP4UTL, and translate string
- ; lengths in them to decimal (how many fingers do YOU got?).
- ; Replace some jump tables with dispatch addresses in tables.
- ; Make help text for SET command consistent with top level help text.
- ;
- ; edit 5: August 21, 1984
- ; Add word at 0100H to allow us to exit cleanly from DDT (shifting
- ; entry section by two bytes).
- ;
- ; edit 4: August 3, 1984 (CJC)
- ; Remove "mover" from entry section, as it now lives in CP4SYS.
- ;
- ; edit 3: July 27, 1984 (CJC)
- ; Merge LASM support from Toad Hall: most of CP4MIT is now in CP4UTL.
- ; When assembling with LASM, CP4MIT is linked by CP4DEF; it links to
- ; CP4PKT. Add SET TACTRAP command. Separate out display routines so
- ; we can eventually do "SHOW <parameter>". Save both bytes of baud
- ; rate in speed, and check both bytes when displaying baud rate. Move
- ; header info to CP4KER.ASM. Add onoff and chkkey routines to simplify
- ; SET command (Toad Hall)
- ;
- ; edit 2: June 8, 1984
- ; formatting and documentation; delete unreferenced variables and some
- ; unnecessary labels; move setpar here from cp4pkt; add module version
- ; string; make this version 4.01.
- ;
- ; edit 1: May, 1984
- ; extracted from CPMBASE.M80 version 3.9; modifications are described
- ; in the accompanying .UPD file.
-
- ;
- ASEG
- ORG 100H
-
- ; The CCP invokes programs with a CALL 100H, with the stack pointer set to
- ; 100H. When we exit to CP/M, we do so with a RET, avoiding a warm boot.
- ; Unfortunately, DDT starts programs with a jump, not a call, so when we
- ; attempt to return to CP/M, we blow the stack and use the word at 100H as
- ; the new PC. Put a 0 there so we reboot instead of dying horribly.
- ; (Fortunately, this happens to be two NOP's).
- dw 0
- jmp start ; Bypass entry section
-
- ;
- ; Entry section for system-independent part. This contains
- ; jumps to routines needed by the system support module.
- ;
- entries:
- jmp kermit ; reentry address
- jmp nout ; output HL in decimal
- entsiz equ $-entries ; length of entry section
- ;
- ; End of entry section. As a consistency check, the expected
- ; length of this section is stored by the system-dependent
- ; module in the linkage section at the end of Kermit, and
- ; tested at initialization.
-
- mitver: db 'CPSMIT.ASM (30) 29-Mar-1991$' ; name, edit number, date
- ;
- ;
- ; Initialization
- ;
- start: lxi h,0 ; Clear out hl pair
- dad sp ; and fetch the system stack pointer
- shld oldsp ; and save for later restoral
- lxi sp,stack ; move in our own stack.
- lxi d,version ; print Kermit version
- call prtstx ; before we do too much (Use fudged prtstr)
- mvi c,rddrv ;Get our logged in drive
- call BDOS
- inr a ;relative 1
- sta CURDSK ;and save it for later
-
- lda vtflg ; [OBS] Hangover from VT52 ems not possible...
- cpi 0ffh ; ... if 0ff stored, assume terminal = off
- mvi a,vtdefo
- jnz start0
- sta vtflg ; if 0ffh make it VT52 off
- start0:
-
-
- IF debug
- ;vvvvvvvvvvvvvvvv remove this for run time
- ; OBS edit 22 - add in a dummy command line to 80H
- lxi h,dcomln ;[22] load up dummy command line
- lxi d,81h ;[22] where to put it
- lxi b,endcoml-dcomln
- mov a,c ; get length to a
- sta 80h ; ... and save as command line length
- call mover ; ... and save rest of line
- jmp starta
- dcomln: db 'set baud 4800',semico
- db 'set dir on',semico
- db 'dir'
- db 0,0 ; just to make up space
- endcoml:
- ;^^^^^^^^^^^^^^^^ remove this for run time
- ENDIF ;debug
-
-
- starta:
- ;
- ; Make sure the overlay is in place...
- ;
- lhld lnkflg
- mov a,h
- ora l ; if lnkflg is still zero,
- jz start1 ; the configuration overlay is missing.
- lxi d,-lnksiz ; if it's not equal to lnksiz,
- dad d ; we've probably got the wrong
- mov a,h ; version of the configuration overlay.
- ora l
- jnz start2
- lhld lnkent ; make sure the overlay knows how long
- lxi d,-entsiz ; our entry section is, so they don't miss.
- dad d
- mov a,h
- ora l
- jnz start2
- ; might be ok.
- lxi h,bdos ; set xbdos address to bdos trap in our code.
- shld xbdos+1 ; (they may never use it...)
- call sysinit ; do system-dependent initialization
- lda bufsec ; get the max no of buffers allowed by system
- sta maxbsc ; save for SET BUFFER use to compare
- lxi d,inms26 ; offer some advice on getting help
- call prtstr
- lxi h,buff ;[19] we copy any potential command tail across
- lxi d,cbuff
- lxi b,80h ;[19] copy all 128 bytes. May use none.
- call mover
- lda 80h ; see if there is a command tail...
-
- ana a
-
-
-
- ; Remove for runtime use
- ; xra a ; make out there is no command tail
- ; Runtime => no XRA above
-
- jz startz
- dcr a
- jz startz ; one character tail...
- lda takflg ; if more characters, say we are have tail
- ori 10h ; set bit 4
- sta takflg
- sta nexitf ; exit back to CP/M after command line
- startz:
- mvi a,0ffh ; when here, system basically initiallised,...
- sta initflg ; apart from KERMIT.INI, so say initialised.
-
- call take1 ;[9] take a KERMIT.INI file
- xra a ;[MF] Say we've done it
- sta initak ;[MF] ...
- jmp kermit ; Start main loop.
-
- start1: lxi d,erms20 ; "Kermit has not been configured"
- call prtstx ; print error message (Use bodge for prtstr)
- jmp exit2 ; and exit.
-
- start2: lxi d,erms21 ; "Consistency check on configuration failed"
- call prtstx ; print error message
- jmp exit2 ; and exit.
- ;
- ;This is the main KERMIT loop. It prompts for and gets the users commands.
-
- kermit: lxi sp,stack ; get new stack pointer, old one might be bad.
- call selcon ; make sure console is selected.
- xra a
- sta mfflg1 ;reset MFNAME
- sta mfflg2 ;ditto
- sta mfflg3
- sta getrxflg ; clear the get/receive flag
- ;0=> receive, non 0 => get
- sta cmbflg ;[MF]Initial keyword must not be blank
- sta cmqflg ;[MF]Allow character-echoing during commands
- sta remtxt ;[MF] Clear remote-text-to-screen flag
- lda curdsk ; update the prompt
- adi 'A'-1
- sta kerm1+2
- call getun ;[11] get the user number into temp1/2
- lda temp1+1 ;[11] get ms value of user number
- cpi '0' ;[11] less than 10 => do a space
- jnz kerm4 ;[11] else do MS digit of user number
- mvi a,' ' ;[11]
- kerm4: sta kerm1 ;[11]
- lda temp1 ;[11] get ls digit of user number
- sta kerm1+1 ;[11] save that
- lda takflg ; are we in TAKE or command line??
- ani 11h ; strip out both bits
- jnz kerm5 ; still in either or both...
- lda nexitf ; if neither, and no-exit-flag set, we quit.
- ana a
- jnz exit ;... back to CP/M, else as you were...
- kerm5:
- lxi d,kerm
- call prompt ;Prompt the user.
-
- kerm7: lxi d,comtab
- lxi h,tophlp
- call keycmd ; Get a keyword
- xchg ; Get result (dispatch address) into HL
- pchl ; Dispatch.
-
- ; here from: log, setcom, read, cfmcmd
- kermt3: lxi d,ermes3 ;"Not confirmed"
- call prtstr
- jmp kermit ;Do it again.
-
- ; Structure of command table:
- ;
- ; 1) Number of entries.
- ; 2) Each entry is arranged as follows:
- ; a) length of command in bytes.
- ; b) 'name of command and $-sign'
- ; c) address of routine to process command
- ;
- ; ---> Note this command table is in alphabetic order.
- ;
-
- comtab: db 32 ; added remote
- ;[obs] added in COPY command, now called FCOPY
- ;[obs] removed remote simply to issue V4.09
- ;[MF]Make FCOPY/FRENAME COPY/RENAME for
- ;[MF]Version 4.10
- ;[MF]Add QUIT as a synonym for EXIT and
- ;[MF]C, R and S as abbreviations for
- ;[MF]CONNECT, RECEIVE and SEND, respectively
- ;[MF]Add STAY as a synonym for SET NO-EXIT
- db 5, 'BREAK$'
- dw break
- db 3, 'BYE$'
- dw bye
- db 1,'C$'
- dw telnet ;[MF]Abbreviation for CONNECT
- db 7, 'CONNECT$'
- dw telnet
- db 4,'COPY$'
- dw copy
- db 9, 'DIRECTORY$'
- dw dir
- db 5, 'ERASE$'
- dw era
- db 4, 'EXIT$'
- dw exit
- db 6, 'FINISH$'
- dw finish
- db 3, 'GET$'
- dw read ; [gnn] entry for GET
- db 4, 'HELP$'
- dw help
- db 5, 'INPUT$'
- dw input
- db 3, 'LOG$'
- dw log
- db 6, 'LOGOUT$'
- dw logout
- db 6, 'OUTPUT$'
- dw string
- db 5, 'PAUSE$'
- dw pause
- db 5, 'PRINT$'
- dw printf ;[obs] print a file
- db 4,'QUIT$'
- dw exit ;[MF]Synonym for EXIT
- db 1,'R$'
- dw read0 ;[MF]Abbreviation for RECEIVE
- db 7, 'RECEIVE$'
- dw read0 ; [gnn] not same as GET now
- db 6, 'REMOTE$'
- dw remote
- db 6,'RENAME$'
- dw rename ;[MF]
- db 1,'S$'
- dw send ;[MF]Abbreviation for SEND
- db 4, 'SEND$'
- dw send
- db 3, 'SET$'
- dw setcom
- db 4, 'SHOW$'
- dw show
- db 6, 'STATUS$'
- dw status
- db 4,'STAY$'
- dw noexit ;STAY (SET NO-EXIT)
- db 4, 'TAKE$' ;[9]
- dw take
- db 8, 'TRANSMIT$'
- dw xmit
- db 4, 'TYPE$'
- dw type ;[obs] type a file command
- db 7, 'VERSION$'
- dw shover
- ; db 4, 'USER$' ; removed [DRJ]
- ; dw user ;[10] removed [DRJ]
- ; top-level help message. Caps indicate keywords.
- ; this text is also printed by the HELP command.
-
- tophlp:
- db cr,lf,'BREAK to send a break to the host'
- db cr,lf,'BYE to host (LOGOUT) and exit to CP/M'
- db cr,lf,'CONNECT to host on selected port'
- db cr,lf,'COPY to copy a CP/M file'
- db cr,lf,'DIRECTORY of current used Micro-disk'
- db cr,lf,'ERASE a CP/M file'
- db cr,lf,'EXIT to CP/M'
- db cr,lf,'FINISH running Kermit on the host'
- db cr,lf,'GET a file from the host'
- db cr,lf,'HELP by giving this message'
- db cr,lf,'INPUT to make the micro wait for a string from the host'
- db cr,lf,'LOG the terminal sessions to a file'
- db cr,lf,'LOGOUT the host'
- db cr,lf,'OUTPUT to send a specified string to the host'
- db cr,lf,'PAUSE to wait for a little time'
- db cr,lf,'PRINT a file to the printer'
- db cr,lf,'QUIT to CP/M'
- db cr,lf,'RECEIVE file from host'
- db cr,lf,'REMOTE to send commands to a remote server'
- db cr,lf,'RENAME to rename a CP/M file'
- db cr,lf,'SEND file to host'
- db cr,lf,'SET a parameter'
- db cr,lf,'SHOW the parameters'
- db cr,lf,'STATUS of Kermit'
- db cr,lf,'STAY at Kermit command-level after a command tail'
- db cr,lf,'TAKE commands from a file' ;[9]
- db cr,lf,'TRANSMIT file to host (in connect state)'
- db cr,lf,'TYPE a file to the console'
- db cr,lf,'VERSION of Kermit running' ;[pcc005]
- ; db cr,lf,'USER to set a different user number' ;removed [DJR]
- db '$' ;[obs] added it here to allow for expansion
-
- ;
- ; This is the BREAK command. It sends a 'B' to the system dependent
- ; interrupt routines (test for escape-cokebottle xxx) and do a break
- ; if the overlay can. Else, we tell user not to be so silly.
- break: call cfmcmd ; get return
- mvi a,'B' ; were gonna do a break if the overlay can
- call sysint ; try doing it..
- jmp kermit ; if we can do it, else
- lxi d,inms12 ;... say not implemented
- jmp kermit
-
- ;
- ;
- ; This is the BYE command. It tells the remote KERSRV to logout,
- ; then exits.
-
- bye: call cfmcmd
- call logo ;Tell the main frame to logout.
- jmp kermit ;If it fails, don't exit.
- call sysbye ; success. do system-dependent cleanup
- jmp exit1 ;Exit Kermit.
-
- ; This is the EXIT command. It leaves KERMIT and returns to CP/M.
- ; alternate entries: exit1, from BYE command;
- ; exit2, from initialization (if it fails)
-
- exit: call cfmcmd ; confirm...
- exit1: call sysexit ; do system-dependent termination
- exit2:
- jmp 0 ; return to CP/M via JUMP instead of RET.
-
- ; lhld oldsp ;Get back the system stack
- ; sphl ;and restore it.
- ; ret ;Then return to system.
-
- ; Input command. Syntax:
- ; INPUT [Wait period] [string]
- ; where
- ; Wait period is a time period to wat for
- ; string is a string to expect back from the host. Control
- ; characters are entered as \ and an octal number.
- ;
- ; I can see uses for this command from other routines...
- ;
- input: mvi a,cmnum ; first get the number
- call comnd ; get it
- jmp kermit ; if we dont understand it...
- lhld number
- shld waitp ; and save as the wait period
- lxi d,stbuff ; where to put the string
- mvi a,cmtxt ; get text
- call comnd
- jmp kermit ; not quite correct...
- sta strcnt ; string count returned in a
- call cfmcmd ; get a confirm
-
- lhld waitp ; multiply the number by
- dad h
- dad h ; ... 4
- dad h ; ... 8
- inx h ; but make sure it is at least 1
- shld waitp ; and save it away again
- shld waitp1 ; save in case we need to reset counter
-
- ; Right, now wait for characters comming from the line, within the
- ; time allowed (very fuzzy). Compare with STRING buffer
- ;
- inp1: xra a
- sta repcnt ; clear the host prompt chars.counter
- inp2: lhld waitp ; have we waited long enough
- dcx h
- shld waitp ; count less one
- mov a,h ; test to see if both zero
- ora l
- jnz inp20 ; nope
- mvi a,3 ; error is three ie total failure
- sta errorc
- jmp inp5 ; take error exit
-
- inp20: call rd1chl ; read a character from the line
- ani 7fh ; set flags
- jnz inp4 ; Not zero => we have a character from host
- call ckchr ; see if *WE* have a character from console
- push psw ; restore to modem
- call selmdm ; reselect the modem port
- pop psw
- ani 7fh ; strip parity (should not be there)
- jnz inp2a ; if a null, try again
- lda strcnt ; if the string length is zero, dont wait.
- ana a
- jnz inp2 ; so loop back again
- jmp kermit ; else drop out
-
- inp2a: cpi cntlc ; do we want to abort?
- ;[MF]Change following line
- ; jz kermit ; in which case exit back to command loop
- jnz inp2b ;[MF] No
- lda takflg ;[MF] Yes, are we TAKEing
- ani 1 ;[MF] commands from a file?
- cnz closet ;[MF] Yes, close and reset to get
- ;[MF] commands from the command-line
- jmp kermit ;[MF] and exit back to command loop
- inp2b: cpi cntlz ; if control z exit back to command loop
- jz kermit ; else try for other characters [MF]
- jmp inp2
-
- inp4: mov e,a ; save it for a while
- lda repcnt ; see if this character matches with one in buffer
- lxi h,stbuff ; point to string buffer
- add l ; make hl = hl + a
- mov l,a
- mvi a,0 ; ie make hl = hl + character count
- adc h
- mov h,a ; not using xra, as that clears the Carry flag
- mov a,e ; get the character back again
- cmp m ; is it = to what we expect?
- jnz inp1 ; no, clear counter and try again
- lda repcnt ; yes, then update the pointer, and ...
- inr a ; ... see if we have received all ...
- sta repcnt ; ... we should have received
- lhld waitp1 ; get original counter
- shld waitp ; and reset the loop (timer) counter
- mov e,a ; save length into E again
- lda strcnt ; get the length to compare
- sub e ; if (e) > string length, we have it
- jnz inp2 ; else wait for a little longer
-
- xra a ; no errors
- sta errorc
- jmp kermit ; so say nothing
- ;else if error...
-
- inp5: lxi d,erms30 ; say message not receive in time...
- call prtstr
- jmp kermit ; have string, so exit
-
- ;
- ;
-
- ; This is the HELP command. It gives a list of the commands.
-
- help: call cfmcmd
- lxi d,tophlp ;The address of the help message.
- call p20ln ;Print at most 20 lines then pause
- ; call prtstr
- jmp kermit
- ;
- ; This is the LOG command. It logs a session to a file.
-
- log: mvi a,cmofi ;[pcc005] Parse an output file spec.
- lxi d,fcb ;[pcc012] where to put it
- call comnd
- jmp kermt3
- call cfmcmd
- lxi h,fcb ;[pcc012] copy file name and ext
- lxi d,lognam ;[pcc012] to a safe place
- lxi b,12 ;[pcc012] 12 bytes
- call mover ;[pcc012] zap ...
- mvi a,1 ;[pcc005] set flag for logging
- sta logflg ;[pcc005]
- jmp kermit ;[pcc005]
-
- ;
- ; PAUSE [Wait period]. Just wait for a couple of tics...
- pause: mvi a,cmnum ; get the number of the wait period
- call comnd ; get it
- jmp kermit ; we canna do it, so get next command
- lhld number
- xchg ; move to d
- lhld clkbit+1 ; get clock bits 8 to 23
- mov a,h ; strip ms bit so we have space for a possible carry
- ani 7fh
- mov h,a
- dad d ; add the number (ie get the number to wait to
- shld number ; save it somewhere
- ;
- ; Now, wait for time to be equal to newer NUMBER with Carry
- ploop:
- call clock ; increment clock
- lda takflg ; test if keyboard interrupt.. not for takes
- ana a
- jnz ploop1 ; do nothing for take command files
- mvi c,dconio ; get status from console
- mvi e,0ffh ; just get the character
- call bdos
- ana a ; if non zero return, then quit
- jnz kermit ; we got something, so quit
- ploop1: lhld number
- xchg
- lhld clkbit+1 ; get bits 8 to 23
- mov a,h
- ani 7fh ; make it 15 bits for a carry...
- mov h,a
- mov a,e ; now, do (DE with carry) - HL
- sub l
- mov e,a
- mov a,d
- sbb h
- ora e ; a = OR of result
- jnz ploop
- jmp kermit ; otherwise we are done.
-
- ; PRINT - Print a file to the console and printer.
- ; This command is active only from the command level, and not
- ; from the connect state. Unfortunately, the print command is
- ; not going to be a background utility.
- printf: mvi a,0ffh ; set the print flag on
- typent: sta prnfl ; Type file entry. Common for PRINT and TYPE
- call type ; and do the rest of the print via type
- xra a
- sta prnfl ; next clear the print flag
- jmp kermit
-
- ; TYPE - Type a file to the console.
- ; This command is really the same as the print command, but the output
- ; is not copied to the printer.
- typef: xra a ; we want to clear the printer on flag
- jmp typent ; go to the type entry in printfile above
-
-
- ;
- ; This is the TAKE command. It take input from a file.
- ; TAKE1 is the entry for automatically TAKE-ing KERMIT.INI (or whatever
- ; the file name at taknam is) from the default drive
- ; [18] code added to accept command tails. See note [18] above
- ;
- take: mvi a,cmifi ;[9] Get filename from user
- lxi d,takfcb ;[9] Take file fcb space
- call comnd ;[9] get the file spec
- jmp kermit ;[9] User failed to specify a good file spec
- call take2 ;[MF] Now TAKE the file
- jmp kermit ;[MF] Go back to main Kermit command loop
- ;
- take1: lxi b,12 ;[9] copy default drive and file name to take fcb
- lxi d,takfcb
- lxi h,taknam
- call mover ;[9] and do it (all other extents etc are zero)
- ;[MF][30]No longer need the following line
- ; jmp take2 ; got the file name, now take it.
- ;
- ;[9] get the file name, now lets open it
- ;
- take2:
- lda takflg ; check to see we have not tak-take
- ani 1 ; if set, we are in a take already
- ;[MF]We can do the following test/call more efficiently
- ; jz take21
- ; call closet ; so close current take file
- cnz closet ;[MF] So close current take file
- take21:
- mvi c,setdma
- lxi d,takdma ;[9] tell bdos where to send data
- call BDOS
- xra a ;[9] clear all these extents etc
- sta takfcb+14
- sta takfcb+32
- lxi d,takfcb ;[9] open the file
- mvi c,openf ;[9] open the file
- call BDOS
- inr a ;[9] if FF returned, problems
- ;[MF]Complain if failure and not seeking KERMIT.INI
- ; jz kermit ;[9] for now, say nowt if no ini file. Else..
- jz ntake ;[9] We'll say file not found
- ;[MF] unless the initial TAKE (KERMIT.INI)
- ; jmp take3 ; a test
- ; mvi c,readf ;[9] read first bytes from file
- ; lxi d,takfcb ;[9]
- ; call BDOS
-
- take3: lxi h,0
- shld takptr ;[9] point to first byte of take file
- lda takflg ; get current flag
- ori 1 ;[9] and set flag to tell Kermit we're taking
- sta takflg
- ;[MF][30]Redo next lines so can flag initial TAKE of KERMIT.INI
- ; call rnsect ;[9] read a sector
- ; jmp kermit ;(Should use a ret, but this will do)
- jmp rnsect ;[9] read a sector and return
-
- ntake: lda initak ;[MF]Is this the initial TAKE (KERMIT.INI)?
- ora a ;[MF]...
- rnz ;[MF]Yes, don't complain
- lxi d,erms15 ;[9] Say file not found
- call prtstr
- ;[MF][30]Make next line a "jmp" since we've called TAKE2
- ; call rstdma ;[9] reset the DMA addres for other files
- ; jmp kermit
- jmp rstdma ;[9] reset the DMA addres for other files
- ;[MF] and return
-
-
- ; Little code to allow some expansion of code without changing
- ; every futher address, only up to the end of this file.
- ; TO BE REMOVED FRO RELEASE!
-
- ; org ($+100h) AND 0FF00H
-
- IF lasm
- LINK CPSCOM
- ENDIF ;lasm
-